// 引入Express框架
const express = require('express')
// 创建Express的路由器实例
const router = express.Router()

// 引入nodes7库用于与S7 PLC通信
var nodes7 = require('nodes7');
// 创建一个nodes7连接实例
var conn = new nodes7;

/**
 * @function: NodeS7
 * @description: 写入数据到PLC
 * @author: allen
 * @version: 1.0.0
 * @param {Object} req - 请求对象，包含要写入的数据
 * @param {Object} res - 响应对象，用于返回写入结果
 * @return {void}
  * @example {
 *  http://localhost:3000/api/writeToPlc?values=100.25
 * }
 */
router.get('/writeToPlc', (req, res) => {
  // 从请求查询参数中提取要写入的值
  const params = req.query.values
  // 使用nodes7实例向PLC写入数据
  conn.writeItems('DB200,Real4', params, (bad,value)=>{
    // 写入失败时打印错误信息
    if(bad) { 
      console.err(`write Items error`) }
    // 写入成功时向客户端返回成功消息
    else {
      res.send('success')
    }
    
  })
})

/**
 * @function: NodeS7
 * @description: 从PLC读取参数
 * @author: allen
 * @version: 1.0.0
 * @param {Object} req - 请求对象，用于接收客户端请求
 * @param {Object} res - 响应对象，用于返回读取结果
 * @return {void}
 * @example {
 *  http://localhost:3000/api/readParaFromPlc?values=DB200,Real4
 * }
 */
router.get('/readParaFromPlc', (req, res) => {
  // 从请求查询参数中提取要读取的参数名
  const params = req.query.values
  // 添加要读取的项到nodes7实例
  conn.addItems(params)
  // 打印要读取的参数名
  console.log(params)
  // 读取所有已添加项的数据
  conn.readAllItems((bad,value)=>{
    // 读取失败时打印错误信息并向客户端返回错误码
    if(bad) { 
      console.err(`read Items error`) 
      res.send(bad)
    }
    // 读取成功时向客户端返回成功消息，并打印读取的值
    else {
      res.send('success')
      console.warn(value)
    }
  })
})

/**
 * @function: NodeS7
 * @description: 连接到PLC
 * @author: allen
 * @version: 1.0.0
 * @param {Object} req - 请求对象，包含连接参数
 * @param {Object} res - 响应对象，用于返回连接结果
 * @return {void}
 * @example {
 *  http://localhost:3000/api/connectPlc?host=192.168.0.1&port=102&rack=0&slot=1
 * }
 */
router.get('/connectPlc', (req, res) => {
  // 从请求查询参数中提取PLC连接参数
  const params = req.query
  // 打印PLC连接参数
  console.log(params)
  // 使用nodes7实例初始化与PLC的连接
  conn.initiateConnection(params, (error)=>{
    // 连接失败时打印错误信息并向客户端返回错误码
    if (typeof(error) !== "undefined") {
      console.error(`PLC error connect`)
      res.send(error)
    }
    // 连接成功时打印成功信息并向客户端返回成功消息
    else{
      console.warn(`PLC connect success`)
      res.send('success')
    }
  });
})

/**
 * @function: NodeS7
 * @description: 断开与PLC的连接
 * @author: allen
 * @version: 1.0.0
 * @param {Object} req - 请求对象，用于接收客户端请求
 * @param {Object} res - 响应对象，用于返回断开连接结果
 * @return {void}
  * @example {
 *  http://localhost:3000/api/disconnectPlc
 * }
 */
router.get('/disconnectPlc', (req, res) => {
  // 使用nodes7实例断开与PLC的连接
  conn.dropConnection(() => {
    // 断开连接后向客户端返回成功消息
    res.send('success')
  });
})

// 导出路由器实例供其他模块使用
module.exports = router